/*
package com.by.service.impl;

import cn.hutool.bloomfilter.BitMapBloomFilter;
import com.by.bean.Goods;
import com.by.config.RedisUtils;
import com.by.mapper.GoodsMapper;
import com.by.service.GoodsService;
import com.by.task.Constant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
public class GoodsServiceImpl2 implements GoodsService {
    @Autowired
    GoodsMapper goodsMapper;

    @Autowired
    RedisUtils redisUtils;

    //布隆过滤器
    BitMapBloomFilter bloomFilter;

    @Override
    public List<Goods> querySecKillGoods() {
        //查缓存
        List<Goods> goodsList = redisUtils.getGoods("goodsList");
        if(null!=goodsList){
            return goodsList;//如果缓存存在 直接返回
        }
        //缓存不存在 查询数据库
        goodsList = goodsMapper.querySecKillGoods();
        //将查询的商品放入缓存
        redisUtils.setGoods("goodsList",goodsList,100000);

        if(null == bloomFilter){
            bloomFilter = new BitMapBloomFilter(goodsList.size()+10);
        }
        //将商品和库存缓存到缓存中
        //遍历商品
        goodsList.forEach(el->{
            String key = "goods:"+el.getId();
            redisUtils.set(key,el.getStock()+"");
            redisUtils.set(key+":name",el.getProductname());
            redisUtils.set(key+":price",el.getPrice()+"");
            //将缓存的商品添加到布隆过滤器
            bloomFilter.add(key);
        });

        return goodsList;
    }

    */
/*@Override
    public int qiang(int id,int userId) {
        //根据商品id查询库存
        String key = "goods:"+id;
        //获取库存
        String tmp = redisUtils.get(key);
        int stock = Integer.parseInt(tmp);
        //判断是否还有库存
        if(stock<=0){
            log.info("用户"+userId+"库存不足"+stock);
            return -1;
        }

        //如果有库存 库存-1 并提示抢购成功
        redisUtils.incr(key,-1);
        log.info("用户"+userId+"抢购到第"+stock+"个商品");
//        stock=stock-1;
//        redisUtils.set(key,stock+"");

        return 1;
    }*//*


    @Override
    public int qiang(int id,int userId) {
        //判断用户是否抢购过
        String userKey = "user:"+userId;
        if(!redisUtils.setNx(userKey,"1")){
            log.info("用户["+userId+"]已经抢购过");
            return -1;
        }

        //根据商品id查询库存
        String key = "goods:"+id;
        while (true){
        //判断商品是否存在
        if (!bloomFilter.contains(key)){
            //如果商品在缓存中不存在 方案: 1 直接返回抢购失败 2 查询数据库

            //尝试获取查询数据库的锁 获取不到等待

                //抢锁
                boolean result = redisUtils.setNxEx("lock","yes",5);

                if (result){
                    //查询数据库
                    Goods goods = goodsMapper.get(id);
                    if(null == goods){
                        //缓存空对象
                        redisUtils.set(key,"0");
                        //加入布隆过滤器
                        bloomFilter.add(key);
                        //商品不存在
                        return -1;
                    }
                    //存在
                    redisUtils.set(key,goods.getStock()+"");
                    redisUtils.set(key+":name",goods.getProductname());
                    redisUtils.set(key+":price",goods.getPrice()+"");
                    //加入布隆过滤器
                    bloomFilter.add(key);
                    //释放锁
                    redisUtils.delete("lock");
                    //执行完 退出循环
                    break;
                }else {
                    //加锁失败 方案: 1 直接返回失败 2 等待锁释放[（1）抢锁（2）判断商品是否存在]）
                    //return -1;//抢购失败
                    //休眠等待
                    try{
                        Thread.sleep(50);
                    }catch (InterruptedException e){
                        throw new RuntimeException(e);
                    }

                }
            }else {
            //退出循环
            break;
        }

        }
        */
/*String goods = redisUtils.get(key);

        if(null == goods){
            //尝试获取查询数据库的锁
            if(redisUtils.setNxEx("lock","yes",5)){
                //加锁成功 查询数据库

                //根据id查询商品

                //将商品加入缓存

            }else {
                //加锁失败 提示抢购失败
                return -1;
            }

            log.info("商品不存在");
            return -1;
        }*//*


        List list = new ArrayList<>();
        list.add(key);
        long num = redisUtils.execLua(getLua(),list);
        if (num==0){
            log.info("用户["+userId+"]抢购第"+num+"个商品失败");
            return -1;
        }
        log.info("用户["+userId+"]抢购到第"+num+"个商品");
        //记录用户已抢购
        redisUtils.set(userKey,"1");
        //正常的逻辑  生成订单  为了快速响应  把抢到的用户及商品信息 存储到队列中   用户  商品
        redisUtils.lpush(Constant.ORDER_QUEUE,userId+":"+id);
        return 1;
    }


    String getLua(){
        StringBuilder lua = new StringBuilder();
        lua.append("  local stock = tonumber(redis.call('get',KEYS[1]));");
        lua.append("  if (stock == 0) then");
        lua.append("  return 0;");
        lua.append("  end;");
        lua.append("  if (stock > 0) then");
        lua.append("  redis.call('incrby',KEYS[1],-1);");
        lua.append("  return stock;");
        lua.append("  end;");
        return lua.toString();
    }


}
*/
